<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/8/28
 * Time: 16:27
 */

namespace app\common\payment\wxpay;


use app\common\payment\wxpay\lib\WxPayApi;
use app\common\payment\wxpay\lib\WxPayNotify;
use app\common\payment\wxpay\lib\WxPayOrderQuery;
use app\common\services\WxpayService;
use http\Exception;

class PayNotifyCallBack extends WxPayNotify
{
    //查询订单
    public function Queryorder($transaction_id)
    {
        $input = new WxPayOrderQuery();
        $input->SetTransaction_id($transaction_id);

        $config = new WxPayConfig();
        try {
            $result = (new WxPayApi)->orderQuery($config, $input);
        } catch (lib\WxPayException $e) {
            return false;
        }
        if(array_key_exists("return_code", $result)
            && array_key_exists("result_code", $result)
            && $result["return_code"] == "SUCCESS"
            && $result["result_code"] == "SUCCESS")
        {
            return true;
        }
        return false;
    }


    //重写回调处理函数
    /**
     * @param WxPayNotifyResults $data 回调解释出的参数
     * @param WxPayConfigInterface $config
     * @param string $msg 如果回调处理失败，可以将错误信息输出到该方法
     * @return true回调出来完成不需要继续回调，false回调处理未完成需要继续回调
     */
    public function NotifyProcess($objData, $config, &$msg)
    {
        writeLog('进入NotifyProcess方法','支付回调信息');
        $data = $objData->GetValues();
        //TODO 1、进行参数校验
        if(!array_key_exists("return_code", $data)
            ||(array_key_exists("return_code", $data) && $data['return_code'] != "SUCCESS")) {
            //TODO失败,不是支付成功的通知
            //如果有需要可以做失败时候的一些清理处理，并且做一些监控
            $msg = "异常异常";
            return false;
        }
        if(!array_key_exists("transaction_id", $data)){
            $msg = "输入参数不正确";
            return false;
        }

        //TODO 2、进行签名验证
        try {
            $checkResult = $objData->CheckSign($config);
            if($checkResult == false){
                //签名错误
                return false;
            }
        } catch(Exception $e) {
        }

        //查询订单，判断订单真实性
        if(!$this->Queryorder($data["transaction_id"])){
            $msg = "订单查询失败";
            return false;
        }

        //TODO 3、处理业务逻辑
        //调用订单服务接口处理订单信息
        writeLog('执行业务逻辑处理','支付回调信息');
        writeLog($data,'支付回调信息');
        try {
            $data['pay_type'] = 1;
            if (!(new WxpayService())->payCallbackDeal($data)) {
                $msg = "业务处理失败";
                return false;
            }
        } catch (Exception $e) {
            return false;
        }
        return true;
    }
}